package com.hsylient.rabbitmq.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class ConsumerTest {

//    /**
//     * declare声明  direct直连 durable 持久化
//     * 这样的写法被废弃了，不推荐这样省略的写法，推荐使用明确的写法
//     * 1. 消费者没有声明链接的交换机名称,那么就会使用rabbitMQ默认的交换机,交换机的名称是一个空字符串,交换机的类型是:Direct
//     * 2. 这里声明的队列名称是:a_hello_word_ht_test 这个队列与交换机相连,使用的routing_key是:a_hello_word_ht_test
//     * 3. 使用queuesToDeclare而没用使用queue,如果rabbitmq中没有名字为a_hello_word_ht_test的队列,那么他就会创建(声明)一个叫这个名字的队列。
//     * 4. 由于我在开发站进行测试的,所以在我使用完希望队列可以删除,因此设置了autoDelete = "true"。当消费者服务关闭的时候这个队列就会被删除
//     * 5. 如果想使用简单模式,那么消费者的队列名称就要与生产者的routing_Key一样才能接收到消息,使用的交换机都是那个默认的交换机
//     * 6. 如果有多个消费者,生产者发送消息后这些消息会被轮询消费,比如:第一台机器消费1 第二台机器消费2 第三台机器消费3 第一台机器消费4
//     * 7. 如果想让某个机器提升消费能力,我们通常的做法是使用多线程消费 rabbitmq给我们一个更简单的处理方式:concurrency = "8" 指定并发消费数
//     * 8. 默认是支持持久化的，也就是durable=true
//     */
//    @RabbitListener(queuesToDeclare = @Queue(value = "a_hello_word_ht_test", autoDelete = "true"), concurrency = "10")
//    public void consumerDefaultExchangeMessage(String message) {
//        ThreadUtil.sleep(10 * 1000L);
//        log.info("[消息消费测试] 成功接收到RabbitMQ发送过来的消息:{}", message);
//    }


//    /**
//     * 1. 声明一个队列名称是：a_direct_test_queue 当没有消费者链接的时候队列会自动删除 当这个队列不存在的时候会自动创建 因为declare属性默认是true
//     * 2. 这个队列绑定的交换机名称是：a_direct_test_exchange，这个交换机的类型是：Direct,默认也是这个类型
//     * 3. 这个交换机在不使用的时候会自动删除。因为我在开发站，省的忘记删除了。
//     * 4. 这个对列接收交换机发送过来的消息，只接受routing_key为：yellow和white的消息
//     * 5. direct 交换机支持单播（消息只发送到一个匹配的队列）和多播（消息发送到多个绑定相同键的队列）。
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "a_direct_test_queue", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_direct_test_exchange", autoDelete = "true"),
//            key = {"yellow", "white"}
//    ))
//    public void consumerDirectExchangeMessageYellowWhite(String message) {
//        log.info("[测试DIRECT交换机发送消息] 队列1成功接收到RabbitMQ发送过来的消息:{}", message);
//    }
//
//    /**
//     * 1. 使用黄色和红色的routing_key来测试Direct(直链交换机能否正确路由消息)
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "a_direct_test_queue_2", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_direct_test_exchange", autoDelete = "true"),
//            key = {"yellow", "red"}
//    ))
//    public void consumerDirectExchangeMessageYellowRed(String message) {
//        log.info("[测试DIRECT交换机发送消息] 队列2成功接收到RabbitMQ发送过来的消息:{}", message);
//    }


//    /**
//     * 1. fanout(扇出)交换机 他会将所有的消息向每个队列都投递一份
//     * 2. 队列与交换机的绑定不需要指定routing_key 交换机会将所有的消息在每个队列投递一份
//     * 3. 如果是线上使用的场景你并不知道线上有多个实例 并且多个实例的代码是一样的 可以使用UUID去动态生成队列名称
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "a_fanout_test_queue", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_fanout_test_exchange", type = ExchangeTypes.FANOUT, autoDelete = "true")
//    ))
//    public void consumerFanoutExchange(String message) {
//        log.info("[测试FANOUT交换机发送消息] 成功接收到RabbitMQ发送过来的消息:{}", message);
//    }
//
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "a_fanout_test_queue2", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_fanout_test_exchange", type = ExchangeTypes.FANOUT, autoDelete = "true")
//    ))
//    public void consumerFanoutExchange2(String message) {
//        log.info("[测试FANOUT交换机发送消息] 队列2成功接收到RabbitMQ发送过来的消息:{}", message);
//    }
//
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "#{T(java.util.UUID).randomUUID().toString()}", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_fanout_test_exchange", type = ExchangeTypes.FANOUT, autoDelete = "true")
//    ))
//    public void consumerFanoutExchange3(String message) {
//        log.info("[测试FANOUT交换机发送消息] 动态队列成功接收到RabbitMQ发送过来的消息:{}", message);
//    }


//    /**
//     * 1. 主题交换机使用时候要注意routing_key的匹配规则
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "a_topic_test_queue1", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_topic_test_exchange", type = ExchangeTypes.TOPIC, autoDelete = "true"),
//            key = {"dog.#", "*.cat.*"}
//    ))
//    public void consumerTopicExchange(String message) {
//        log.info("[测试TOPIC交换机发送消息] 队列成功接收到RabbitMQ发送过来的消息:{}", message);
//    }


//    /**
//     * 1. 延时消息使用的交换机类型是Direct,不写默认就是这个类型的交换机 通过delayed = "true" 将它设置为延时交换机
//     * 2. 实现延时消息的方式是使用 <延时消息的插件> 如果使用docker安装rabbitmq，默认是没有安装延时插件的，启动会报错
//     * 3.
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(value = "a_delayed_message_queue", autoDelete = "true", durable = "true"),
//            exchange = @Exchange(value = "a_delayed_message_exchange", autoDelete = "true", delayed = "true"),
//            key = {"a_delayed_message"}
//    ))
//    public void consumerDelayedMessage(String message) {
//        log.info("[测试延时消息] 队列成功接收到RabbitMQ发送过来延时的消息:{}", message);
//    }
}
